import { cloneDeep } from '@/utils/method.ts';

export const removeType3Items = (
  menuList: Array<MenuItem>,
  authItems: Record<string, string[]> = {},
): { acc: Array<MenuItem>; authItems: Record<string, string[]> } => {
  // 检查menuList是否为数组，如果不是则抛出错误
  if (!Array.isArray(menuList) || !menuList.length) {
    throw new Error('menuList must be an array');
  }
  // 尝试深拷贝，若失败则尝试浅拷贝
  const List: MenuItem[] = cloneDeep(menuList) || [];

  // 使用reduce方法遍历menuList数组，累积生成新的不包含类型3项目的数组
  const result = List.reduce((acc: Array<MenuItem>, item) => {
    // 如果当前菜单项的类型不是3，则进行进一步处理
    if (item.type !== '3') {
      // 如果当前菜单项包含子项且子项为数组，则进行过滤
      if (Array.isArray(item.children)) {
        // 过滤出不包含类型3的子项
        const filteredChildren = item.children.filter(
          (child) => child.type !== '3',
        );
        // 记录所有被移除的类型3子项的键值
        const removedKeys = item.children
          .filter((child) => child.type === '3')
          .map((child) => child.key);

        // 如果有子项被移除，则更新removedItems记录，并根据情况删除或更新当前菜单项的子项
        if (removedKeys.length > 0) {
          authItems[item.key] = removedKeys;
          if (filteredChildren.length > 0) {
            item.children = filteredChildren;
          } else {
            delete item.children;
          }
        } else {
          // 如果没有子项被移除，则递归处理子项
          const children = removeType3Items(filteredChildren, authItems);
          item.children = children.acc;
        }
      }
      // 将处理后的菜单项添加到累积数组中
      acc.push(item);
    }
    return acc;
  }, []);
  return {
    acc: result,
    authItems,
  };
};
// 导出一个名为 parseBreadcrumb 的函数，该函数接收两个参数：路径字符串 path 和菜单项数组 menuList，返回一个 MenuItem 数组
export const parseBreadcrumb = (
  path: string,
  menuList: MenuItem[],
): MenuItem[] => {
  // 将路径字符串按 '/' 分割成数组
  const pathArray = path.split('/');
  // 如果路径数组长度小于2，说明路径无效，直接返回空数组
  if (pathArray.length < 2) return [];

  // 初始化临时菜单数组为传入的菜单列表
  let tempMenu = menuList || [];
  const result: MenuItem[] = [];

  for (let i = 1; i < pathArray.length; i++) {
    const subPath = `/${pathArray.slice(1, i + 1).join('/')}`;
    const foundMenu = tempMenu.find((menu) => menu.key === subPath);

    if (foundMenu) {
      result.push(foundMenu);
      tempMenu = foundMenu.children || [];
    } else {
      break;
    }
  }

  return result;
};
